EC2 をIAMユーザ/アクセスキーからIAM Roleへ移行する手順を検証
こんにちは、菊池です。
本日(2017/2/10)、既存のEC2に後からIAM Roleを適用することができるようになりました!
- New! Attach an AWS IAM Role to an Existing Amazon EC2 Instance by Using the AWS CLI
- Attach an IAM role to your existing Amazon EC2 instance
- [アップデート]既存のEC2にIAM Roleを付与できるようになりました!
はじめに
EC2のアプリケーションでAWSの認証を行う上では、IAM Roleを利用するのがベストプラクティスです。しかし、IAM Roleの適用はインスタンスを新規作成する際にしかできませんでした。そのため、後から必要になった際に止むを得ずIAMユーザのアクセスキー/シークレットキーを利用していた方も多いのではないでしょうか。
今回のアップデートにより、IAM Roleへの移行を検討されることもあると思いますので、移行時の手順・注意点をまとめました。
手順と注意点
基本的な手順は以下のようになります。
- IAM Roleの適用
- 利用する認証情報をIAMユーザのアクセスキー/シークレットキーからIAM Roleへ変更
- アクセスアドバイザーでIAMユーザの権限が利用されていないことを確認
- IAMユーザのアクセスキーを無効化
以下、IAMユーザ/IAM Roleを切り替えていくにあたり、AWS CLIのaws sts get-caller-identity
で権限の状態を確認していきます。わかりやすくするため、IAMユーザとIAM Roleで別のアカウントIDを使いました。
作業前の確認です。
$ aws sts get-caller-identity { "Account": "xxxxxxxx2334", "UserId": "AIDAIANC5E2KUCN3NEH3G", "Arn": "arn:aws:iam::xxxxxxxx2334:user/iam-test" }
アカウント"xxxxxxxx2334"の、"iam-test"というIAMユーザを利用しています。
まずは対象インスタンスにIAM Roleを適用します。以下のブログでも紹介の通り、現時点ではCLIでの操作になります。
$ aws ec2 associate-iam-instance-profile --instance-id i-07e43f94a47957f26 --iam-instance-profile Name=iam-test { "IamInstanceProfileAssociation": { "InstanceId": "i-07e43f94a47957f26", "State": "associating", "AssociationId": "iip-assoc-02d186fea75bc6761", "IamInstanceProfile": { "Id": "AIPAJ7WCC5JAQ2QW2VWBO", "Arn": "arn:aws:iam::yyyyyyyy6521:instance-profile/iam-test" } } }
この時点では、まだ元のIAMユーザの権限が利用可能なのでアカウントIDを取得すると、
$ aws sts get-caller-identity { "Account": "xxxxxxxx2334", "UserId": "AIDAIANC5E2KUCN3NEH3G", "Arn": "arn:aws:iam::xxxxxxxx2334:user/iam-test" }
上記の通り、IAM Role適用前と同じ結果となります。IAM Roleが適用されたインスタンスでも、IAMユーザのアクセスキーが指定されていればそちらを優先して利用します。なので、新規に割り当てたIAM Roleの権限が不足していた場合などでも、突然権限でエラーになることはありません。逆に、慌ててIAMユーザのアクセスキーを無効化してしまわないようにしましょう。この時点でアクセスキーを無効化してしまうと、
$ aws sts get-caller-identity An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.
このように認証でエラーとなってしまいます。回避するためにアプリケーションが利用する認証情報をIAMユーザからIAM Roleに切り替えてやる必要があります。
AWS CLIのaws configure
コマンドでアクセスキー/シークレットキーを設定した場合には、~/.aws/credentials
に保存されていますので、このファイルを削除します。
$ rm ~/.aws/credentials
複数のOSユーザで利用していた場合、各ユーザ毎に設定されてますのでご注意ください。これにより、IAM Roleの権限が利用されるようになります。
$ aws sts get-caller-identity { "Account": "yyyyyyyy6521", "UserId": "AROAIHK74VWTQZH3MJ22C:i-07e43f94a47957f26", "Arn": "arn:aws:sts::yyyyyyyy6521:assumed-role/iam-test/i-07e43f94a47957f26" }
アカウント"yyyyyyyy6521"のIAM Roleが利用できています。
切り替え後しばらく運用したら、元のIAMユーザのアクセスアドバイザーを参照し、その認証情報が利用された形跡がないか確認しましょう。
もし切り替え以降に利用している形跡があれば、どこかのアプリケーションに埋め込まれたアクセスキーが残っている可能性がありますので、CloudTrailなどで利用元を調査しましょう。
最後に、不要になったアクセスキーを無効化し、最終的に削除すれば完全に移行完了です。
最後に
今回のアップデートで、IAM Role適用が進むと思いましたので検証してみました。少しでもお役に立てれば幸いです。